#pragma once
#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <string>   // 提供 std::string
#include <cstdint>  // 提供 int32_t
//使用一个全局线程安全的日志器
namespace chatroom{
    std::shared_ptr<spdlog::logger> logger;
    // mode中True表示发布模式，False表示调试模式
    // filename表示文件名
    // level表示日志的等级
    void InitLogger(bool mode,const std::string& filename,int32_t level)
    {
        if(mode == true)
        {
            logger = spdlog::basic_logger_mt("Run-logger",filename);
            logger->set_level((spdlog::level::level_enum)level);
            logger->flush_on((spdlog::level::level_enum)level);
        }else{
            logger = spdlog::stdout_color_mt("debug-logger");
            logger->set_level(spdlog::level::level_enum::trace);
            logger->flush_on(spdlog::level::level_enum::trace);
        }
        logger->set_pattern("[%n]%Y-%m-%d %H:%M:%S [%t] [%-8l] %v");
    }
}
#define     Logger_TRACE(format,...)        chatroom::logger->trace(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define     Logger_DEBUG(format,...)        chatroom::logger->debug(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define     Logger_INFO(format,...)         chatroom::logger->info(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define     Logger_WARN(format,...)         chatroom::logger->warn(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define     Logger_ERROR(format,...)        chatroom::logger->error(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__)
#define     Logger_FATAL(format,...)        chatroom::logger->critical(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__)